home *** CD-ROM | disk | FTP | other *** search
/ Light ROM 1 / LIGHT-ROM 1 (Amiga Library Services)(1994).iso / ffdisks / d886.lha / TrackEd / Sources / Menu.c < prev    next >
C/C++ Source or Header  |  1993-07-16  |  5KB  |  223 lines

  1.  
  2. /* Menu.c  menu structures and routines referred to in menus */
  3.  
  4. #include <libraries/asl.h>
  5. #include <utility/tagitem.h>
  6. #include <dos/dos.h>
  7. #include <exec/memory.h>
  8. #include <intuition/intuition.h>
  9. #include <libraries/gadtools.h>
  10. #include <clib/intuition_protos.h>
  11. #include <clib/gadtools_protos.h>
  12.  
  13. extern struct Library *AslBase;
  14. extern struct TextAttr Style;
  15. extern struct Window *Window;
  16. extern struct StringInfo Block_info;
  17. extern int drive;
  18. extern UBYTE *BB, *RB;
  19.  
  20. /* Menu ID's */
  21. #define m_file   0
  22. #define m_sector 1
  23. #define m_buffer 2
  24. #define m_search 3
  25.  
  26. struct NewMenu My_NewMenu[] =
  27. {
  28.     { NM_TITLE, "Project",              0 , 0, 0, 0,},
  29.     { NM_ITEM,    "About",               0 , 0, 0, 0,},
  30.     { NM_ITEM,    "Quit",                 "Q", 0, 0, 0,},
  31.     { NM_TITLE, "Sector",              0 , 0, 0, 0,},
  32.     { NM_ITEM,    "Read again",         "R", 0, 0, 0,},
  33.     { NM_ITEM,    "Write back",         "W", 0, 0, 0,},
  34.     { NM_ITEM,    "Load from file",  "L", 0, 0, 0,},
  35.     { NM_ITEM,    "Save as file",     "S", 0, 0, 0,},
  36.     { NM_ITEM,    "Calc Checksum",     "C", 0, 0, 0,},
  37.     { NM_TITLE, "Buffer",              0 , 0, 0, 0,},
  38.     { NM_ITEM,    "Read from buffer", 0 , 0, 0, 0,},
  39.     { NM_ITEM,    "Write to buffer",  0 , 0, 0, 0,},
  40.     { NM_TITLE, "Search",              0 , 0, 0, 0,},
  41.     { NM_ITEM,    "Search string",      0 , 0, 0, 0,},
  42.     { NM_ITEM,    "Search number",      0 , 0, 0, 0,},
  43.     { NM_END,  NULL,                      0 , 0, 0, 0,},
  44. };
  45.  
  46. struct TagItem  TIA[] =
  47. {
  48.     ASL_OKText, NULL, ASL_TopEdge, 40, ASL_LeftEdge, 50, ASL_Height, 140,
  49.     ASL_Width, 156, TAG_END, 0
  50. };
  51.  
  52. int GetName(headertext, string)
  53. char headertext[];
  54. char string[];
  55. {
  56.     int i, j;
  57.     char *FN, *DN;
  58.     struct FileRequester *FR;
  59.     int rc;
  60.  
  61.     if ((AslBase = (struct Library *) OpenLibrary(AslName, 0L)))
  62.     {
  63.         TIA[0].ti_Data = (ULONG) headertext;
  64.         FR = (struct FileRequester *) AllocAslRequest(ASL_FileRequest, TIA);
  65.         FN = (char *) RequestFile(FR);
  66.         DN = FR->rf_Dir;
  67.         if (FN)
  68.         {
  69.             for (i = 0; DN[i] != 0; i++) string[i] = DN[i];
  70.             if ((i != 0) && (DN[i-1] != ':')) string[i++] = '/';
  71.             for (j = 0; FN[j] != 0; j++) string[i+j] = FN[j];
  72.             string[i+j] = 0;
  73.             rc = i+j;
  74.         }
  75.         else rc = 0;
  76.         FreeFileRequest(FR);
  77.     }
  78.     else
  79.     {
  80.         ShowText2(Window, "asl.library not found.", "Load/Save aborted", NULL);
  81.         rc = 0;
  82.     }
  83.     return(rc);
  84. }
  85.  
  86. void LoadBlock(buffer)
  87. UBYTE *buffer;
  88. {
  89.     char Filename[256];
  90.     struct Filehandle *f;
  91.     LONG br;
  92.  
  93.     if (GetName("Load", Filename))
  94.     {
  95.         f = (struct Filehandle *) Open(Filename, MODE_OLDFILE);
  96.         if (!f) ShowText2(Window, "Error opening file", "Load aborted", NULL);
  97.         else
  98.         {
  99.             if ((br = Read(f, buffer, 512L)) != 512L)
  100.                 ShowText2(Window, "Not a full block loaded", NULL, NULL);
  101.             Close(f);
  102.             UpDateSB();
  103.         }
  104.     }
  105. }
  106.  
  107. void SaveBlock(buffer)
  108. UBYTE *buffer;
  109. {
  110.     char Filename[256];
  111.     struct Filehandle *f;
  112.     LONG bw;
  113.  
  114.     if (GetName("Save", Filename))
  115.     {
  116.         f = (struct Filehandle *) Open(Filename, MODE_NEWFILE);
  117.         if (!f) ShowText2(Window, "Error opening file", "Save aborted", NULL);
  118.         else
  119.         {
  120.             if ((bw = Write(f, buffer, 512L)) != 512L)
  121.                 ShowText2(Window, "Error writing data",
  122.                     "Check disk and try again", NULL);
  123.             else ShowText2(Window, "Block saved.", NULL, NULL);
  124.             Close(f);
  125.         }
  126.     }
  127. }
  128.  
  129. void CalcCheck(buffer)
  130. LONG *buffer;
  131. {
  132.     int i;
  133.     LONG L;
  134.  
  135.     buffer[5] = 0;
  136.     L = 0;
  137.     for (i = 0; i < 128; i++) L += buffer[i];
  138.     buffer[5] = -L;
  139.     UpDateSB();
  140. }
  141.  
  142. BOOL DoMenu(menu, item, sub)
  143. UWORD menu, item, sub;
  144. {
  145.     int i, td_err;
  146.     BOOL rc = TRUE;
  147.  
  148.     switch(menu)
  149.     {
  150.         case m_file:
  151.             switch(item)
  152.             {
  153.                 case 0: /* About */
  154.                     ShowText2(Window, "TrackEd v1.24  21-may-93",
  155.                          "by Camiel Rouweler", "Thank you");
  156.                     break;
  157.  
  158.                 case 1: /* Quit */
  159.                     rc = FALSE;
  160.                     break;
  161.             }
  162.             break;
  163.  
  164.         case m_buffer:
  165.             switch(item)
  166.             {
  167.                 case 0: /* read from buffer */
  168.                     for (i = 0; i < 512; i++) BB[i] = RB[i];
  169.                     UpDateSB();
  170.                     break;
  171.  
  172.                 case 1: /* write to buffer */
  173.                     for (i = 0; i < 512; i++) RB[i] = BB[i];
  174.                     break;
  175.             }
  176.             break;
  177.  
  178.         case m_sector:
  179.             switch(item)
  180.             {
  181.                 case 0: /* Re-read */
  182.                     td_err = ReadBlocks(drive, (WORD) Block_info.LongInt, 1, BB);
  183.                     if (td_err) ProcessTDError(td_err);
  184.                     UpDateSB();
  185.                     break;
  186.  
  187.                 case 1: /* Write back */
  188.                     td_err = WriteBlocks(drive, (WORD) Block_info.LongInt, 1, BB);
  189.                     if (td_err) ProcessTDError(td_err);
  190.                     UpDateSB();
  191.                     break;
  192.  
  193.                 case 2: /* Load Block */
  194.                     LoadBlock(BB);
  195.                     break;
  196.  
  197.                 case 3: /* Save Block */
  198.                     SaveBlock(BB);
  199.                     break;
  200.  
  201.                 case 4: /* Calculate Checksum */
  202.                     CalcCheck(BB);
  203.                     break;
  204.             }
  205.             break;
  206.  
  207.         case m_search:
  208.             switch(item)
  209.             {
  210.                 case 0: /* Search String */
  211.                     SearchS();
  212.                     break;
  213.  
  214.                 case 1: /* Search Number */
  215.                     SearchB();
  216.                     break;
  217.             }
  218.  
  219.             break;
  220.     }
  221.     return(rc);
  222. }
  223.